Summary
This workflow demonstrates the mitosRNAseq pipeline which identifies several types of small RNA from sequencing data from short reads of <50 nt. The following method collects sequence-based counts, sequence locations, genomic features, and annotations. The data we use is from killifish embyros anoxia experiments.
The step-by-step workflow we follow is illistrated below and a detailed method to perform small RNA seq on an academic HPC is decsribed in this document.

The following table shows the contents of the file samples.csv that contains metadata for our samples. We start with a total of 40 fastq files.
Sample Table
|
#
|
Sample
|
Condition
|
Stage
|
Input files
|
|
1
|
31_4d_t0
|
4d_t0
|
4
|
31_4d_t0.fastq.gz
|
|
2
|
32_4d_t0
|
4d_t0
|
4
|
32_4d_t0.fastq.gz
|
|
3
|
33_4d_t0
|
4d_t0
|
4
|
33_4d_t0.fastq.gz
|
|
4
|
34_4d_t0
|
4d_t0
|
4
|
34_4d_t0.fastq.gz
|
|
5
|
35_4d_4hrA
|
4d_4hrA
|
4
|
35_4d_4hrA.fastq.gz
|
|
6
|
36_4d_4hrA
|
4d_4hrA
|
4
|
36_4d_4hrA.fastq.gz
|
|
7
|
37_4d_4hrA
|
4d_4hrA
|
4
|
37_4d_4hrA.fastq.gz
|
|
8
|
38_4d_4hrA
|
4d_4hrA
|
4
|
38_4d_4hrA.fastq.gz
|
|
9
|
39_4d_24hrA
|
4d_24hrA
|
4
|
39_4d_24hrA.fastq.gz
|
|
10
|
40_4d_24hrA
|
4d_24hrA
|
4
|
40_4d_24hrA.fastq.gz
|
|
11
|
41_4d_24hrA
|
4d_24hrA
|
4
|
41_4d_24hrA.fastq.gz
|
|
12
|
42_4d_24hrA
|
4d_24hrA
|
4
|
42_4d_24hrA.fastq.gz
|
|
13
|
43_4d_2hrR
|
4d_2hrR
|
4
|
43_4d_2hrR.fastq.gz
|
|
14
|
44_4d_2hrR
|
4d_2hrR
|
4
|
44_4d_2hrR.fastq.gz
|
|
15
|
45_4d_2hrR
|
4d_2hrR
|
4
|
45_4d_2hrR.fastq.gz
|
|
16
|
46_4d_2hrR
|
4d_2hrR
|
4
|
46_4d_2hrR.fastq.gz
|
|
17
|
47_4d_24hrR
|
4d_24hrR
|
4
|
47_4d_24hrR.fastq.gz
|
|
18
|
48_4d_24hrR
|
4d_24hrR
|
4
|
48_4d_24hrR.fastq.gz
|
|
19
|
49_4d_24hrR
|
4d_24hrR
|
4
|
49_4d_24hrR.fastq.gz
|
|
20
|
50_4d_24hrR
|
4d_24hrR
|
4
|
50_4d_24hrR.fastq.gz
|
|
21
|
1_12d_t0
|
12d_t0
|
12
|
1_12d_t0.fastq.gz
|
|
22
|
2_12d_t0
|
12d_t0
|
12
|
2_12d_t0.fastq.gz
|
|
23
|
5_12d_t0
|
12d_t0
|
12
|
5_12d_t0.fastq.gz
|
|
24
|
6_12d_t0
|
12d_t0
|
12
|
6_12d_t0.fastq.gz
|
|
25
|
10_12d_4hrA
|
12d_4hrA
|
12
|
10_12d_4hrA.fastq.gz
|
|
26
|
11_12d_4hrA
|
12d_4hrA
|
12
|
11_12d_4hrA.fastq.gz
|
|
27
|
12_12d_4hrA
|
12d_4hrA
|
12
|
12_12d_4hrA.fastq.gz
|
|
28
|
7_12d_4hrA
|
12d_4hrA
|
12
|
7_12d_4hrA.fastq.gz
|
|
29
|
13_12d_24hrA
|
12d_24hrA
|
12
|
13_12d_24hrA.fastq.gz
|
|
30
|
16_12d_24hrA
|
12d_24hrA
|
12
|
16_12d_24hrA.fastq.gz
|
|
31
|
17_12d_24hrA
|
12d_24hrA
|
12
|
17_12d_24hrA.fastq.gz
|
|
32
|
18_12d_24hrA
|
12d_24hrA
|
12
|
18_12d_24hrA.fastq.gz
|
|
33
|
19_12d_2hrR
|
12d_2hrR
|
12
|
19_12d_2hrR.fastq.gz
|
|
34
|
21_12d_2hrR
|
12d_2hrR
|
12
|
21_12d_2hrR.fastq.gz
|
|
35
|
22_12d_2hrR
|
12d_2hrR
|
12
|
22_12d_2hrR.fastq.gz
|
|
36
|
23_12d_2hrR
|
12d_2hrR
|
12
|
23_12d_2hrR.fastq.gz
|
|
37
|
25_12d_24hrR
|
12d_24hrR
|
12
|
25_12d_24hrR.fastq.gz
|
|
38
|
28_12d_24hrR
|
12d_24hrR
|
12
|
28_12d_24hrR.fastq.gz
|
|
39
|
29_12d_24hrR
|
12d_24hrR
|
12
|
29_12d_24hrR.fastq.gz
|
|
40
|
30_12d_24hrR
|
12d_24hrR
|
12
|
30_12d_24hrR.fastq.gz
|
QC for raw reads
Quality Control (QC) is done by running fastQC on raw reads to evaluate how good (or bad) our data looks.
Install software for Quality Check
conda
Set up a virtual environment in conda that has all of the Quality Control (QC) tools. We are using Miniconda. For creating sharable environments, create .yaml files for each environment you’re making.
conda create -n condafastqc fastqc
conda activate condafastqc
conda install -n multiqc
tmux
For almost every long-ish process, we use tmux to run tasks in a detached terminal window that can keep running if we want to log out or if we accidently log out.
tmux new -s fastqc
Executing
Creating a new file called fastqcr.R that has the script to run fastqc through R. We use this script to automate the process for a list of files in a directory. Running commands through various scripts also keeps a record of our commands.
if (!require("fastqcr")) {
install.packages("fastqcr", repos="http://cran.us.r-project.org")
library(fastqcr)
} else {library(fastqcr)}
fastqc(fq.dir="/path/to/directory/init_fastq_files",
qc.dir="/path/to/directory/fastqc/init_fastqc",
threads=20)
Running the script with the following command:
Rscript fastqcr.R
Press Ctrl+B and then D for detaching this tmux window. You can log out from your remote computer (HPC) and close your terminal window now while this process keeps running on your remote computer. To get back to this window, log in to your remote computer, and use the command tmux a -t fastqc. F or more information, check tmux.
We will get a fastqc HTML file in the output fastqc directory for each fastq sequence in the input init_fastq_files directory.
FastQC Output
General Statistics from multiqc
| Sample |
PercentDups |
PercentGC |
BPMedianReadLength |
MillionsSeqs |
| 10_12d_4hrA |
94.1 |
51 |
36 |
12.6 |
| 11_12d_4hrA |
92.7 |
51 |
36 |
16.2 |
| 12_12d_4hrA |
87.4 |
52 |
36 |
9.0 |
| 13_12d_24hrA |
90.5 |
53 |
36 |
8.5 |
| 16_12d_24hrA |
91.1 |
50 |
36 |
7.9 |
| 17_12d_24hrA |
92.4 |
50 |
36 |
29.9 |
| 18_12d_24hrA |
84.6 |
52 |
36 |
11.8 |
| 19_12d_2hrR |
87.6 |
52 |
36 |
11.6 |
| 1_12d_t0 |
86.4 |
51 |
36 |
8.7 |
| 21_12d_2hrR |
95.4 |
54 |
36 |
9.8 |
| 22_12d_2hrR |
80.5 |
52 |
36 |
6.7 |
| 23_12d_2hrR |
89.3 |
52 |
36 |
7.8 |
| 25_12d_24hrR |
88.1 |
53 |
36 |
13.5 |
| 28_12d_24hrR |
91.1 |
55 |
36 |
5.9 |
| 29_12d_24hrR |
91.4 |
54 |
36 |
8.3 |
| 2_12d_t0 |
91.5 |
54 |
36 |
8.3 |
| 30_12d_24hrR |
79.9 |
53 |
36 |
12.8 |
| 31_4d_t0 |
79.3 |
52 |
50 |
11.9 |
| 32_4d_t0 |
80.1 |
53 |
50 |
11.6 |
| 33_4d_t0 |
86.3 |
51 |
50 |
13.7 |
| 34_4d_t0 |
82.9 |
52 |
50 |
15.2 |
| 35_4d_4hrA |
88.4 |
52 |
50 |
11.0 |
| 36_4d_4hrA |
87.0 |
51 |
50 |
13.8 |
| 37_4d_4hrA |
84.7 |
52 |
50 |
15.6 |
| 38_4d_4hrA |
84.4 |
51 |
50 |
15.3 |
| 39_4d_24hrA |
79.7 |
53 |
50 |
12.4 |
| 40_4d_24hrA |
74.4 |
51 |
50 |
12.9 |
| 41_4d_24hrA |
79.3 |
52 |
50 |
9.7 |
| 42_4d_24hrA |
85.6 |
53 |
50 |
16.7 |
| 43_4d_2hrR |
88.3 |
52 |
50 |
13.0 |
| 44_4d_2hrR |
81.5 |
44 |
101 |
11.0 |
| 45_4d_2hrR |
87.9 |
44 |
101 |
13.8 |
| 46_4d_2hrR |
88.9 |
52 |
50 |
16.9 |
| 47_4d_24hrR |
72.8 |
45 |
101 |
14.6 |
| 48_4d_24hrR |
83.2 |
53 |
50 |
13.4 |
| 49_4d_24hrR |
87.1 |
51 |
50 |
22.8 |
| 50_4d_24hrR |
88.9 |
41 |
101 |
14.8 |
| 5_12d_t0 |
81.3 |
53 |
36 |
11.2 |
| 6_12d_t0 |
81.7 |
53 |
36 |
13.6 |
| 7_12d_4hrA |
81.4 |
52 |
36 |
10.5 |
Sequence Counts for each sample
The mean quality scores per base in the read
The average quality scores per sequence
The GC content per sequence
Sequence Duplication
Overrepresented sequences
Adapter Content
Overall Pass/Fail
Sequence length distribution
All samples had sequences of a single length (50bp , 36bp , 101bp).
Trimming
Trimming is done with Trimmomatic in our case, however, other tools like cutadapt or fastp may also be used. This tool runs through the following bash script
FILES="/disk/bioscratch/Podrab_lab/gazal/sRNA_gazal/copied_old_infiles/init_fastq_files/*.fastq.gz"
for f in $FILES
do
b=`basename $f`
echo Running trimming for the file $b
c=${b::-9}
o="$c.trim.fastq"
log="$c.out.log"
c="$c.log.txt"
java -jar /disk/bioscratch/Podrab_lab/gazal/sRNA_gazal/trim/Trimmomatic-0.39/trimmomatic-0.39.jar SE -threads 20 -phred33 -trimlog $c $f $o ILLUMINACLIP:/disk/bioscratch/Podrab_lab/gazal/sRNA_gazal/copied_old_infiles/adapter_contamination_sequences_AR3.txt:2:30:5:1:true SLIDINGWINDOW:5:15 LEADING:20 TRAILING:20 MINLEN:15 2> $log
done
| Sample |
TotalReads |
SurvivingReads |
PercentSurviving |
DroppedReads |
PercentDropped |
| 10_12d_4hrA |
12625447 |
4421375 |
35.0 |
8204072 |
65.0 |
| 11_12d_4hrA |
16238016 |
8893201 |
54.8 |
7344815 |
45.2 |
| 12_12d_4hrA |
9024387 |
7219072 |
80.0 |
1805315 |
20.0 |
| 13_12d_24hrA |
8467459 |
5182199 |
61.2 |
3285260 |
38.8 |
| 16_12d_24hrA |
7908381 |
6458185 |
81.7 |
1450196 |
18.3 |
| 17_12d_24hrA |
29872147 |
17868683 |
59.8 |
12003464 |
40.2 |
| 18_12d_24hrA |
11793810 |
8182929 |
69.4 |
3610881 |
30.6 |
| 19_12d_2hrR |
11606761 |
9574385 |
82.5 |
2032376 |
17.5 |
| 1_12d_t0 |
8698124 |
6498924 |
74.7 |
2199200 |
25.3 |
| 21_12d_2hrR |
9784686 |
3585294 |
36.6 |
6199392 |
63.4 |
| 22_12d_2hrR |
6741253 |
4728213 |
70.1 |
2013040 |
29.9 |
| 23_12d_2hrR |
7836111 |
4455897 |
56.9 |
3380214 |
43.1 |
| 25_12d_24hrR |
13534542 |
8957294 |
66.2 |
4577248 |
33.8 |
| 28_12d_24hrR |
5866632 |
2402889 |
41.0 |
3463743 |
59.0 |
| 29_12d_24hrR |
8305061 |
2923930 |
35.2 |
5381131 |
64.8 |
| 2_12d_t0 |
8344087 |
6946381 |
83.2 |
1397706 |
16.8 |
| 30_12d_24hrR |
12811149 |
8785705 |
68.6 |
4025444 |
31.4 |
| 31_4d_t0 |
11936271 |
10306761 |
86.3 |
1629510 |
13.7 |
| 32_4d_t0 |
11595360 |
7974434 |
68.8 |
3620926 |
31.2 |
| 33_4d_t0 |
13655749 |
10422782 |
76.3 |
3232967 |
23.7 |
| 34_4d_t0 |
15201813 |
11186661 |
73.6 |
4015152 |
26.4 |
| 35_4d_4hrA |
11045591 |
7821501 |
70.8 |
3224090 |
29.2 |
| 36_4d_4hrA |
13840101 |
9383343 |
67.8 |
4456758 |
32.2 |
| 37_4d_4hrA |
15579833 |
12373672 |
79.4 |
3206161 |
20.6 |
| 38_4d_4hrA |
15286687 |
12142640 |
79.4 |
3144047 |
20.6 |
| 39_4d_24hrA |
12442304 |
9755623 |
78.4 |
2686681 |
21.6 |
| 40_4d_24hrA |
12866355 |
11130799 |
86.5 |
1735556 |
13.5 |
| 41_4d_24hrA |
9720710 |
8032689 |
82.6 |
1688021 |
17.4 |
| 42_4d_24hrA |
16698310 |
12979297 |
77.7 |
3719013 |
22.3 |
| 43_4d_2hrR |
12989273 |
9158318 |
70.5 |
3830955 |
29.5 |
| 44_4d_2hrR |
10968948 |
8421811 |
76.8 |
2547137 |
23.2 |
| 45_4d_2hrR |
13812376 |
6527219 |
47.3 |
7285157 |
52.7 |
| 46_4d_2hrR |
16946884 |
12011097 |
70.9 |
4935787 |
29.1 |
| 47_4d_24hrR |
14627707 |
12933658 |
88.4 |
1694049 |
11.6 |
| 48_4d_24hrR |
13383720 |
10269804 |
76.7 |
3113916 |
23.3 |
| 49_4d_24hrR |
22803428 |
18172334 |
79.7 |
4631094 |
20.3 |
| 50_4d_24hrR |
14759393 |
7495120 |
50.8 |
7264273 |
49.2 |
| 5_12d_t0 |
11217968 |
7594023 |
67.7 |
3623945 |
32.3 |
| 6_12d_t0 |
13607922 |
9592402 |
70.5 |
4015520 |
29.5 |
| 7_12d_4hrA |
10489257 |
6515199 |
62.1 |
3974058 |
37.9 |
QC for trimmed reads
Quality Control (QC) is done for the trimmed reads with fastQC. We activate the conda environment condafastqc for this process.
if (!require("fastqcr")) {
install.packages("fastqcr", repos="http://cran.us.r-project.org")
library(fastqcr)
} else {library(fastqcr)}
fastqc(fq.dir="/path/to/directory/trimmed_fastq_files",
qc.dir="/path/to/directory/fastqc/trim_fastqc",
threads=20)
Running the script with the following command:
Rscript fastqcr.R
FastQC Output
Plots for each FASTQC metric after trimming is shown below. All the adapters were removed and overall quality looks better.
General Statistics from multiqc
| Sample |
PercentDups |
PercentGC |
BPMedianReadLength |
MillionsSeqs |
| 10_12d_4hrA |
89.4 |
50 |
22 |
4.4 |
| 11_12d_4hrA |
90.3 |
49 |
22 |
8.9 |
| 12_12d_4hrA |
88.7 |
51 |
22 |
7.2 |
| 13_12d_24hrA |
88.4 |
50 |
22 |
5.2 |
| 16_12d_24hrA |
91.9 |
48 |
22 |
6.5 |
| 17_12d_24hrA |
91.2 |
48 |
22 |
17.9 |
| 18_12d_24hrA |
84.9 |
50 |
22 |
8.2 |
| 19_12d_2hrR |
88.5 |
51 |
22 |
9.6 |
| 1_12d_t0 |
86.7 |
49 |
22 |
6.5 |
| 21_12d_2hrR |
90.5 |
47 |
22 |
3.6 |
| 22_12d_2hrR |
80.9 |
50 |
22 |
4.7 |
| 23_12d_2hrR |
86.9 |
49 |
22 |
4.5 |
| 25_12d_24hrR |
86.6 |
50 |
22 |
9.0 |
| 28_12d_24hrR |
84.3 |
50 |
22 |
2.4 |
| 29_12d_24hrR |
83.9 |
50 |
22 |
2.9 |
| 2_12d_t0 |
93.8 |
53 |
22 |
6.9 |
| 30_12d_24hrR |
78.7 |
51 |
22 |
8.8 |
| 31_4d_t0 |
80.8 |
49 |
22 |
10.3 |
| 32_4d_t0 |
77.1 |
50 |
22 |
8.0 |
| 33_4d_t0 |
86.5 |
48 |
22 |
10.4 |
| 34_4d_t0 |
81.7 |
51 |
22 |
11.2 |
| 35_4d_4hrA |
86.5 |
50 |
22 |
7.8 |
| 36_4d_4hrA |
82.7 |
49 |
22 |
9.4 |
| 37_4d_4hrA |
84.8 |
51 |
22 |
12.4 |
| 38_4d_4hrA |
84.2 |
48 |
22 |
12.1 |
| 39_4d_24hrA |
79.1 |
51 |
23 |
9.8 |
| 40_4d_24hrA |
73.6 |
50 |
27 |
11.1 |
| 41_4d_24hrA |
79.0 |
49 |
22 |
8.0 |
| 42_4d_24hrA |
85.3 |
50 |
22 |
13.0 |
| 43_4d_2hrR |
86.9 |
50 |
22 |
9.2 |
| 44_4d_2hrR |
82.1 |
50 |
20 |
8.4 |
| 45_4d_2hrR |
80.0 |
50 |
20 |
6.5 |
| 46_4d_2hrR |
88.4 |
48 |
22 |
12.0 |
| 47_4d_24hrR |
73.3 |
48 |
26 |
12.9 |
| 48_4d_24hrR |
82.6 |
52 |
22 |
10.3 |
| 49_4d_24hrR |
87.9 |
49 |
22 |
18.2 |
| 50_4d_24hrR |
84.4 |
49 |
20 |
7.5 |
| 5_12d_t0 |
81.2 |
50 |
22 |
7.6 |
| 6_12d_t0 |
82.7 |
51 |
22 |
9.6 |
| 7_12d_4hrA |
79.5 |
50 |
22 |
6.5 |
Sequence Counts for each sample
The mean quality scores per base in the read
The average quality scores per sequence
The GC content per sequence
Sequence Duplication
Overrepresented sequences
Overall Pass/Fail
Sequence length distribution
Alignment
The trimmed reads are aligned to the reference genome using bowtie. To analyze reads mapping with mitochondrial genome, we perform the alignment in two steps.
- Complete Genome (with mitochondrial genome)- with algenome.fa
- Only the Mitochondrial genome which is extracted from genome.fa- almitogenome.fa
To begin alignment, we make bowtie indexes, this is done in two sets.
bowtie-index algenome.fa
bowtie-index almitogenome.fa
Alignment with genome
The alignment was done on the trimmed reads from previous section.
#!/bin/bash
FILES="/disk/bioscratch/Podrab_lab/gazal/sRNA_gazal/trim/*.fastq"
for f in $FILES
do
b=`basename $f`
echo Running trimming for the file $b
t=${b::-6}
o="$t.sam"
uo="$t.mapped.fq"
echo Output file is $o
bowtie \
-p 20 \
-t \
-k 5 \
--best \
--strata \
-e 99999 \
-v 0 \
-l 15 \
--chunkmbs 2048 \
-x /disk/bioscratch/Podrab_lab/gazal/sRNA_gazal/bowtie_index_alim/algenome \
-q $f \
--al $uo \
--sam --no-unal > $o 2> $t.bowtie.log
done
#done
The following stats show alignment QC.
This table shows the number of reads aligned in each sample (MillionAlignedReads). It also shows the number of aligments of various reads that includes multimapped reads (MillionMappedReads).
|
Sample
|
PercentAligned
|
MillionAlignedReads
|
MillionMappedReads
|
|
10_12d_4hrA
|
73.2
|
3.2
|
8.0
|
|
11_12d_4hrA
|
73.6
|
6.5
|
15.4
|
|
12_12d_4hrA
|
70.4
|
5.1
|
12.4
|
|
13_12d_24hrA
|
69.6
|
3.6
|
8.7
|
|
16_12d_24hrA
|
77.5
|
5.0
|
10.3
|
|
17_12d_24hrA
|
75.8
|
13.5
|
31.4
|
|
18_12d_24hrA
|
73.7
|
6.0
|
15.0
|
|
19_12d_2hrR
|
71.9
|
6.9
|
16.8
|
|
1_12d_t0
|
73.3
|
4.8
|
11.1
|
|
21_12d_2hrR
|
77.8
|
2.8
|
5.3
|
|
22_12d_2hrR
|
66.2
|
3.1
|
7.4
|
|
23_12d_2hrR
|
73.2
|
3.3
|
7.8
|
|
25_12d_24hrR
|
69.7
|
6.2
|
15.0
|
|
28_12d_24hrR
|
65.3
|
1.6
|
3.7
|
|
29_12d_24hrR
|
70.9
|
2.1
|
5.0
|
|
2_12d_t0
|
76.9
|
5.3
|
13.1
|
|
30_12d_24hrR
|
65.5
|
5.8
|
13.8
|
|
31_4d_t0
|
62.0
|
6.4
|
11.8
|
|
32_4d_t0
|
73.5
|
5.9
|
12.2
|
|
33_4d_t0
|
80.6
|
8.4
|
15.0
|
|
34_4d_t0
|
70.5
|
7.9
|
15.8
|
|
35_4d_4hrA
|
71.5
|
5.6
|
9.2
|
|
36_4d_4hrA
|
62.1
|
5.8
|
8.3
|
|
37_4d_4hrA
|
69.1
|
8.6
|
16.4
|
|
38_4d_4hrA
|
76.1
|
9.2
|
15.4
|
|
39_4d_24hrA
|
79.0
|
7.7
|
17.2
|
|
40_4d_24hrA
|
52.3
|
5.8
|
10.9
|
|
41_4d_24hrA
|
63.0
|
5.1
|
8.8
|
|
42_4d_24hrA
|
66.6
|
8.6
|
15.2
|
|
43_4d_2hrR
|
71.2
|
6.5
|
11.7
|
|
44_4d_2hrR
|
64.6
|
5.4
|
11.8
|
|
45_4d_2hrR
|
65.7
|
4.3
|
9.5
|
|
46_4d_2hrR
|
71.2
|
8.6
|
13.8
|
|
47_4d_24hrR
|
80.1
|
10.4
|
24.4
|
|
48_4d_24hrR
|
51.8
|
5.3
|
10.7
|
|
49_4d_24hrR
|
72.3
|
13.1
|
23.2
|
|
50_4d_24hrR
|
79.4
|
6.0
|
13.4
|
|
5_12d_t0
|
66.2
|
5.0
|
11.9
|
|
6_12d_t0
|
67.5
|
6.5
|
15.5
|
|
7_12d_4hrA
|
65.6
|
4.3
|
10.1
|
Alignment with mitochondria
The alignment was done on the trimmed reads from previous section.
The following stats show alignment QC.
#!/bin/bash
FILES="/disk/bioscratch/Podrab_lab/gazal/sRNA_gazal/trim/*.fastq"
for f in $FILES
do
b=`basename $f`
echo Running alignment for the file $b
t=${b::-6}
o="$t.sam"
uo="$t.mapped.fq"
echo Output file is $o
bowtie \
-p 20 \
-t \
-k 10 \
--best \
--strata \
-e 99999 \
-v 0 \
-l 15 \
--chunkmbs 2048 \
-x /disk/bioscratch/Podrab_lab/gazal/sRNA_gazal/bowtie_mito_index/almitogenome \
-q $f \
--al $uo \
--sam --no-unal > $o 2> $t.bowtie.log
done
#done
This table shows the number of reads aligned in each sample (MillionAlignedReads). It also shows the number of aligments of various reads that includes multimapped reads (MillionMappedReads).
|
Sample
|
PercentAligned
|
MillionAlignedReads
|
MillionMappedReads
|
|
10_12d_4hrA
|
0.34
|
0.01
|
0.02
|
|
11_12d_4hrA
|
0.47
|
0.04
|
0.04
|
|
12_12d_4hrA
|
0.41
|
0.03
|
0.03
|
|
13_12d_24hrA
|
0.50
|
0.03
|
0.03
|
|
16_12d_24hrA
|
0.52
|
0.03
|
0.03
|
|
17_12d_24hrA
|
3.25
|
0.58
|
0.59
|
|
18_12d_24hrA
|
6.22
|
0.51
|
0.52
|
|
19_12d_2hrR
|
0.92
|
0.09
|
0.09
|
|
1_12d_t0
|
1.25
|
0.08
|
0.08
|
|
21_12d_2hrR
|
0.79
|
0.03
|
0.03
|
|
22_12d_2hrR
|
4.43
|
0.21
|
0.21
|
|
23_12d_2hrR
|
2.68
|
0.12
|
0.12
|
|
25_12d_24hrR
|
4.72
|
0.42
|
0.43
|
|
28_12d_24hrR
|
0.32
|
0.01
|
0.01
|
|
29_12d_24hrR
|
4.08
|
0.12
|
0.12
|
|
2_12d_t0
|
0.25
|
0.02
|
0.02
|
|
30_12d_24hrR
|
8.18
|
0.72
|
0.73
|
|
31_4d_t0
|
4.99
|
0.51
|
0.52
|
|
32_4d_t0
|
10.12
|
0.81
|
0.82
|
|
33_4d_t0
|
1.99
|
0.21
|
0.21
|
|
34_4d_t0
|
6.72
|
0.75
|
0.77
|
|
35_4d_4hrA
|
0.43
|
0.03
|
0.03
|
|
36_4d_4hrA
|
0.59
|
0.06
|
0.06
|
|
37_4d_4hrA
|
1.10
|
0.14
|
0.14
|
|
38_4d_4hrA
|
5.67
|
0.69
|
0.70
|
|
39_4d_24hrA
|
8.32
|
0.81
|
0.83
|
|
40_4d_24hrA
|
7.77
|
0.87
|
0.88
|
|
41_4d_24hrA
|
7.50
|
0.60
|
0.61
|
|
42_4d_24hrA
|
2.13
|
0.28
|
0.28
|
|
43_4d_2hrR
|
0.61
|
0.06
|
0.06
|
|
44_4d_2hrR
|
1.00
|
0.08
|
0.09
|
|
45_4d_2hrR
|
4.69
|
0.31
|
0.31
|
|
46_4d_2hrR
|
1.07
|
0.13
|
0.13
|
|
47_4d_24hrR
|
16.68
|
2.16
|
2.19
|
|
48_4d_24hrR
|
0.18
|
0.02
|
0.02
|
|
49_4d_24hrR
|
1.49
|
0.27
|
0.28
|
|
50_4d_24hrR
|
2.22
|
0.17
|
0.17
|
|
5_12d_t0
|
6.11
|
0.46
|
0.47
|
|
6_12d_t0
|
6.47
|
0.62
|
0.63
|
|
7_12d_4hrA
|
5.39
|
0.35
|
0.36
|
Using aligned reads
Coming Soon
miRTrace
Running mirtrace with the following command.
#!/bin/bash
mirtrace qc --species dre --config seq_address.txt
Looking at the results:

sports
Executing sports tool on mapped reads only. We use the following command to run:
#!/bin/bash
sports.pl -i seqs_alim_mito.txt \
-o /disk/bioscratch/Podrab_lab/gazal/sRNA_gazal/align_with_alimnaeus/gen_input_fastq/SPORTS/out_sports/REDO/mito_mapped_reads \
-k \
-M 2 \
-p 20 \
-g /disk/bioscratch/Podrab_lab/gazal/sRNA_gazal/bowtie_mito_index/almitogenome \
-m /disk/bioscratch/Podrab_lab/gazal/sRNA_gazal/align_with_alimnaeus/gen_input_fastq/SPORTS/sports1.1/db/Danio_rerio/miRBase_21/miRBase_21-dre \
-r /disk/bioscratch/Podrab_lab/gazal/sRNA_gazal/align_with_alimnaeus/gen_input_fastq/SPORTS/sports1.1/db/Danio_rerio/rRNA_db/zebrafish_rRNA \
-t /disk/bioscratch/Podrab_lab/gazal/sRNA_gazal/align_with_alimnaeus/gen_input_fastq/SPORTS/sports1.1/db/Danio_rerio/GtRNAdb/danRer6-tRNAs \
-w /disk/bioscratch/Podrab_lab/gazal/sRNA_gazal/align_with_alimnaeus/gen_input_fastq/SPORTS/sports1.1/db/Danio_rerio/piRBase/piR_dre_v1.0 \
-e /disk/bioscratch/Podrab_lab/gazal/sRNA_gazal/align_with_alimnaeus/gen_input_fastq/SPORTS/sports1.1/db/Danio_rerio/Ensembl/Danio_rerio.GRCz10.ncrna \
-f /disk/bioscratch/Podrab_lab/gazal/sRNA_gazal/align_with_alimnaeus/gen_input_fastq/SPORTS/sports1.1/db/Danio_rerio/Rfam_12.3/Rfam-12.3-zebrafish
This will generate a number of output files, from which the tables generated as a result file *_output.txt for each sample are taken and are used to extract annotation of mapped reads. Top 50 rows of this table are shown for the sample 10_12d_4hrA below.

It also generates a number of plots to categorize the annotations and their length distributions for each sample.

Compiling output files
Coming Soon
Visualizing
We use the alignments with mitochondrial genome to view the aligned reads.
Jbrowse is used to explore alignments.
Files used:
- Aligned bam files for each sample and its corresponding index file (bam, bai)
- Reference genome for mitochondria (.fasta) and its index file (.fai)
- Genome feature file (.gff) for mitochondrial genome

This figure shows mitochondiral genome of 100bp length from 17100 to 17199. On this genome, we see 1) the colored basepairs, 2) Genomic features of the mentioned length, 3) Alignments from 4 samples (4d t0 replicates) that show reads aligned to the genome colored by strand while also showing the coverage histogram in grey.
LS0tCnRpdGxlOiAibWl0b3NSTkFzZXEgV29ya2Zsb3ciCmRhdGU6IDA4LTE1LTIwMjQKb3V0cHV0OiAKICAgIGh0bWxfbm90ZWJvb2s6CiAgICAgICAgdG9jOiBUUlVFCiAgICAgICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKCiMjICBTdW1tYXJ5ClRoaXMgd29ya2Zsb3cgZGVtb25zdHJhdGVzIHRoZSBtaXRvc1JOQXNlcSBwaXBlbGluZSB3aGljaCBpZGVudGlmaWVzIHNldmVyYWwgdHlwZXMgb2YKc21hbGwgUk5BIGZyb20gc2VxdWVuY2luZyBkYXRhIGZyb20gc2hvcnQgcmVhZHMgb2YgPDUwIG50LiBUaGUgZm9sbG93aW5nIG1ldGhvZCBjb2xsZWN0cyBzZXF1ZW5jZS1iYXNlZCAKY291bnRzLCBzZXF1ZW5jZSBsb2NhdGlvbnMsIGdlbm9taWMgZmVhdHVyZXMsIGFuZCBhbm5vdGF0aW9ucy4gClRoZSBkYXRhIHdlIHVzZSBpcyBmcm9tIGtpbGxpZmlzaCBlbWJ5cm9zIGFub3hpYSBleHBlcmltZW50cy4gCgpUaGUgc3RlcC1ieS1zdGVwIHdvcmtmbG93IHdlIGZvbGxvdyBpcyBpbGxpc3RyYXRlZCBiZWxvdyBhbmQgYSAKZGV0YWlsZWQgbWV0aG9kIHRvIHBlcmZvcm0gc21hbGwgUk5BIHNlcSBvbiBhbiBhY2FkZW1pYyBIUEMgaXMgZGVjc3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIAoKIVtdKC9ob21lL2dhemFsL0RvY3VtZW50cy9QU1Vfd29yay9zUk5BX2dhemFsL2RvY3VtZW50YXRpb24vRmlndXJlIDEucG5nKQoKVGhlIGZvbGxvd2luZyB0YWJsZSBzaG93cyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgKipzYW1wbGVzLmNzdioqIHRoYXQgY29udGFpbnMgbWV0YWRhdGEgZm9yIG91ciBzYW1wbGVzLgpXZSBzdGFydCB3aXRoIGEgdG90YWwgb2YgNDAgZmFzdHEgZmlsZXMuCgojIyMgU2FtcGxlIFRhYmxlCmBgYHtyIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGZvcm1hdHRhYmxlKQpsaWJyYXJ5KHJlYWRyKQpkZl9zYW1wbGVzIDwtIHJlYWRfY3N2KCJzYW1wbGVzLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCmZvcm1hdHRhYmxlKGRmX3NhbXBsZXMsCiAgICAgICAgdGFibGUuYXR0ciA9ICdzdHlsZSA9ICJ3aWR0aDo1MCU7IGZvbnQtc2l6ZTo5MCU7IicKICAgICAgICApCmBgYAoKIyMgUUMgZm9yIHJhdyByZWFkcwoKUXVhbGl0eSBDb250cm9sIChRQykgaXMgZG9uZSBieSBydW5uaW5nIGZhc3RRQyBvbiByYXcgcmVhZHMgdG8gZXZhbHVhdGUgaG93IGdvb2QgKG9yIGJhZCkgb3VyIGRhdGEgbG9va3MuCgojIyMgSW5zdGFsbCBzb2Z0d2FyZSBmb3IgUXVhbGl0eSBDaGVjawoKKipjb25kYSoqCgpTZXQgdXAgYSB2aXJ0dWFsIGVudmlyb25tZW50IGluIGNvbmRhIHRoYXQgaGFzIGFsbCBvZiB0aGUgUXVhbGl0eSBDb250cm9sIChRQykgdG9vbHMuIApXZSBhcmUgdXNpbmcgW01pbmljb25kYV0oaHR0cHM6Ly9kb2NzLmFuYWNvbmRhLmNvbS9taW5pY29uZGEvKS4gCkZvciBjcmVhdGluZyBzaGFyYWJsZSBlbnZpcm9ubWVudHMsIGNyZWF0ZSAueWFtbCBmaWxlcyBmb3IgZWFjaCBlbnZpcm9ubWVudCB5b3UncmUgbWFraW5nLgoKYGBgCmNvbmRhIGNyZWF0ZSAtbiBjb25kYWZhc3RxYyBmYXN0cWMKY29uZGEgYWN0aXZhdGUgY29uZGFmYXN0cWMKY29uZGEgaW5zdGFsbCAtbiBtdWx0aXFjCmBgYAoKKip0bXV4KioKCkZvciBhbG1vc3QgZXZlcnkgbG9uZy1pc2ggcHJvY2VzcywgCndlIHVzZSB0bXV4IHRvIHJ1biB0YXNrcyBpbiBhIGRldGFjaGVkIHRlcm1pbmFsIHdpbmRvdyB0aGF0IGNhbiBrZWVwIHJ1bm5pbmcgaWYgd2Ugd2FudCB0byBsb2cgb3V0IG9yIGlmIHdlIGFjY2lkZW50bHkgbG9nIG91dC4KYGBgCnRtdXggbmV3IC1zIGZhc3RxYwpgYGAKCiMjIyBFeGVjdXRpbmcKCkNyZWF0aW5nIGEgbmV3IGZpbGUgY2FsbGVkICoqZmFzdHFjci5SKiogdGhhdCBoYXMgdGhlIHNjcmlwdCB0byBydW4gZmFzdHFjIHRocm91Z2ggUi4KV2UgdXNlIHRoaXMgc2NyaXB0IHRvIGF1dG9tYXRlIHRoZSBwcm9jZXNzIGZvciBhIGxpc3Qgb2YgZmlsZXMgaW4gYSBkaXJlY3RvcnkuIApSdW5uaW5nIGNvbW1hbmRzIHRocm91Z2ggdmFyaW91cyBzY3JpcHRzIGFsc28ga2VlcHMgYSByZWNvcmQgb2Ygb3VyIGNvbW1hbmRzLgoKYGBgCmlmICghcmVxdWlyZSgiZmFzdHFjciIpKSB7CiAgICAgICAgaW5zdGFsbC5wYWNrYWdlcygiZmFzdHFjciIsIHJlcG9zPSJodHRwOi8vY3Jhbi51cy5yLXByb2plY3Qub3JnIikKICAgICAgICBsaWJyYXJ5KGZhc3RxY3IpCn0gZWxzZSB7bGlicmFyeShmYXN0cWNyKX0KZmFzdHFjKGZxLmRpcj0iL3BhdGgvdG8vZGlyZWN0b3J5L2luaXRfZmFzdHFfZmlsZXMiLAogICAgICBxYy5kaXI9Ii9wYXRoL3RvL2RpcmVjdG9yeS9mYXN0cWMvaW5pdF9mYXN0cWMiLAogICAgICB0aHJlYWRzPTIwKQpgYGAKClJ1bm5pbmcgdGhlIHNjcmlwdCB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKYGBgClJzY3JpcHQgZmFzdHFjci5SCmBgYApQcmVzcyBgQ3RybCtCYCBhbmQgdGhlbiBgRGAgZm9yIGRldGFjaGluZyB0aGlzIHRtdXggd2luZG93LiAKWW91IGNhbiBsb2cgb3V0IGZyb20geW91ciByZW1vdGUgY29tcHV0ZXIgKEhQQykgYW5kIGNsb3NlIHlvdXIgdGVybWluYWwgCndpbmRvdyBub3cgd2hpbGUgdGhpcyBwcm9jZXNzIGtlZXBzIHJ1bm5pbmcgb24geW91ciByZW1vdGUgY29tcHV0ZXIuIApUbyBnZXQgYmFjayB0byB0aGlzIHdpbmRvdywgbG9nIGluIHRvIHlvdXIgcmVtb3RlIGNvbXB1dGVyLCBhbmQKIHVzZSB0aGUgY29tbWFuZCBgdG11eCBhIC10IGZhc3RxY2AuIEYKb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sgW3RtdXhdKGh0dHBzOi8vZ2l0aHViLmNvbS90bXV4L3RtdXgvd2lraS9HZXR0aW5nLVN0YXJ0ZWQpLiAKCldlIHdpbGwgZ2V0IGEgZmFzdHFjIEhUTUwgZmlsZSBpbiB0aGUgb3V0cHV0IGZhc3RxYyBkaXJlY3RvcnkgZm9yIAplYWNoIGZhc3RxIHNlcXVlbmNlIGluIHRoZSBpbnB1dCBpbml0X2Zhc3RxX2ZpbGVzIGRpcmVjdG9yeS4KCiMjIyBGYXN0UUMgT3V0cHV0CgoqKkdlbmVyYWwgU3RhdGlzdGljcyBmcm9tIG11bHRpcWMqKgpgYGB7ciBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJywgd2FybmluZz1GQUxTRX0KbGlicmFyeShyZWFkcikKbGlicmFyeShmb3JtYXR0YWJsZSkKZGZfc3RhdHMgPC0gcmVhZF90c3YoIm11bHRpcWNfaW5pdF9mYXN0cS9nZW5lcmFsX3N0YXRzX3RhYmxlLnRzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCmlzLm51bSA8LSBzYXBwbHkoZGZfc3RhdHMsIGlzLm51bWVyaWMpCmRmX3N0YXRzW2lzLm51bV0gPC0gbGFwcGx5KGRmX3N0YXRzW2lzLm51bV0sIHJvdW5kLCAxKQpmb3JtYXR0YWJsZShkZl9zdGF0cywgbGlzdCgKICAgICdQZXJjZW50RHVwcycgPSBjb2xvcl9iYXIoIiNFOTk2N0EiKSwKICAgICdQZXJjZW50R0MnID0gY29sb3JfYmFyKCIjREFBNTIwIiksCiAgICAnQlBNZWRpYW5SZWFkTGVuZ3RoJyA9IGNvbG9yX2JhcigiIzY2Q0RBQSIpLAogICAgJ01pbGxpb25zU2VxcycgPSBjb2xvcl9iYXIoIiNEQTcwRDYiKSksCiAgICB0YWJsZS5hdHRyID0gImNsYXNzPVwndGFibGUgdGFibGUtY29uZGVuc2VkXCcsIHN0eWxlPVwnd2lkdGg6ODAlOyBmb250LXNpemU6OTAlO1wnIgopCmBgYAoKKipTZXF1ZW5jZSBDb3VudHMgZm9yIGVhY2ggc2FtcGxlKioKCiFbU2VxdWVuY2UgQ291bnRzXShtdWx0aXFjX2luaXRfZmFzdHEvbXVsdGlxY19wbG90cy9mYXN0cWNfc2VxdWVuY2VfY291bnRzX3Bsb3QucG5nKXt3aWR0aD01NTBweH0KCioqVGhlIG1lYW4gcXVhbGl0eSBzY29yZXMgcGVyIGJhc2UgaW4gdGhlIHJlYWQqKgoKIVtQZXIgQmFzZSBRdWFsaXR5XShtdWx0aXFjX2luaXRfZmFzdHEvbXVsdGlxY19wbG90cy9mYXN0cWNfcGVyX2Jhc2Vfc2VxdWVuY2VfcXVhbGl0eV9wbG90LnBuZyl7d2lkdGg9NTUwcHh9CgoqKlRoZSBhdmVyYWdlIHF1YWxpdHkgc2NvcmVzIHBlciBzZXF1ZW5jZSoqCgohW1BlciBTZXF1ZW5jZSBRdWFsaXR5XShtdWx0aXFjX2luaXRfZmFzdHEvbXVsdGlxY19wbG90cy9mYXN0cWNfcGVyX3NlcXVlbmNlX3F1YWxpdHlfc2NvcmVzX3Bsb3QucG5nKXt3aWR0aD01NTBweH0KCioqVGhlIEdDIGNvbnRlbnQgcGVyIHNlcXVlbmNlKioKCiFbR0MgY29uZXRlbnRdKG11bHRpcWNfaW5pdF9mYXN0cS9tdWx0aXFjX3Bsb3RzL2Zhc3RxY19wZXJfc2VxdWVuY2VfZ2NfY29udGVudF9wbG90LnBuZyl7d2lkdGg9NTUwcHh9CgoKKipTZXF1ZW5jZSBEdXBsaWNhdGlvbioqCgohW0R1cGxpY2F0aW9uIGluIGVhY2ggc2VxdWVuY2VdKG11bHRpcWNfaW5pdF9mYXN0cS9tdWx0aXFjX3Bsb3RzL2Zhc3RxY19zZXF1ZW5jZV9kdXBsaWNhdGlvbl9sZXZlbHNfcGxvdC5wbmcpe3dpZHRoPTU1MHB4fQoKKipPdmVycmVwcmVzZW50ZWQgc2VxdWVuY2VzKioKCiFbVG90YWwgb3ZlcnJlcHJlc2VudGVkIHNlcXVlbmNlcyBmb3VuZCBpbiBlYWNoIHNhbXBsZV0obXVsdGlxY19pbml0X2Zhc3RxL211bHRpcWNfcGxvdHMvZmFzdHFjX292ZXJyZXByZXNlbnRlZF9zZXF1ZW5jZXNfcGxvdC5wbmcpe3dpZHRoPTU1MHB4fQoKKipBZGFwdGVyIENvbnRlbnQqKgoKIVtBZGFwdGVycyBmb3VuZCBhdCBzZXF1ZW5jZSBwb3NpdGlvbnNdKG11bHRpcWNfaW5pdF9mYXN0cS9tdWx0aXFjX3Bsb3RzL2Zhc3RxY19hZGFwdGVyX2NvbnRlbnRfcGxvdC5wbmcpe3dpZHRoPTU1MHB4fQoKKipPdmVyYWxsIFBhc3MvRmFpbCoqCgohW0NoZWNraW5nIGlmIGVhY2ggc2FtcGxlIHBhc3NlcyBvciBmYWlscyBpbiB2YXJpb3VzIG1ldGVyaXNdKG11bHRpcWNfaW5pdF9mYXN0cS9tdWx0aXFjX3Bsb3RzL2Zhc3RxYy1zdGF0dXMtY2hlY2staGVhdG1hcC5wbmcpe3dpZHRoPTU1MHB4fQoKKipTZXF1ZW5jZSBsZW5ndGggZGlzdHJpYnV0aW9uKioKCkFsbCBzYW1wbGVzIGhhZCBzZXF1ZW5jZXMgb2YgYSBzaW5nbGUgbGVuZ3RoICg1MGJwICwgMzZicCAsIDEwMWJwKS4KCiMjIFRyaW1taW5nCgpUcmltbWluZyBpcyBkb25lIHdpdGggVHJpbW1vbWF0aWMgaW4gb3VyIGNhc2UsIGhvd2V2ZXIsIG90aGVyIHRvb2xzIGxpa2UgY3V0YWRhcHQgb3IgZmFzdHAgbWF5IGFsc28gYmUgdXNlZC4KVGhpcyB0b29sIHJ1bnMgdGhyb3VnaCB0aGUgZm9sbG93aW5nIGJhc2ggc2NyaXB0CgpgYGAKRklMRVM9Ii9kaXNrL2Jpb3NjcmF0Y2gvUG9kcmFiX2xhYi9nYXphbC9zUk5BX2dhemFsL2NvcGllZF9vbGRfaW5maWxlcy9pbml0X2Zhc3RxX2ZpbGVzLyouZmFzdHEuZ3oiCmZvciBmIGluICRGSUxFUwogICAgZG8KICAgICAgICBiPWBiYXNlbmFtZSAkZmAKICAgICAgICBlY2hvIFJ1bm5pbmcgdHJpbW1pbmcgZm9yIHRoZSBmaWxlICRiCgogICAgICAgIGM9JHtiOjotOX0KICAgICAgICBvPSIkYy50cmltLmZhc3RxIgoJbG9nPSIkYy5vdXQubG9nIgogICAgICAgIGM9IiRjLmxvZy50eHQiCiAgICAgICAgamF2YSAtamFyIC9kaXNrL2Jpb3NjcmF0Y2gvUG9kcmFiX2xhYi9nYXphbC9zUk5BX2dhemFsL3RyaW0vVHJpbW1vbWF0aWMtMC4zOS90cmltbW9tYXRpYy0wLjM5LmphciBTRSAtdGhyZWFkcyAyMCAtcGhyZWQzMyAtdHJpbWxvZyAkYyAkZiAkbyBJTExVTUlOQUNMSVA6L2Rpc2svYmlvc2NyYXRjaC9Qb2RyYWJfbGFiL2dhemFsL3NSTkFfZ2F6YWwvY29waWVkX29sZF9pbmZpbGVzL2FkYXB0ZXJfY29udGFtaW5hdGlvbl9zZXF1ZW5jZXNfQVIzLnR4dDoyOjMwOjU6MTp0cnVlIFNMSURJTkdXSU5ET1c6NToxNSBMRUFESU5HOjIwIFRSQUlMSU5HOjIwIE1JTkxFTjoxNSAyPiAkbG9nCiAgICBkb25lCmBgYAoKIVtSZWFkcyBTdXJ2aXZpbmddKHRyaW1tb21hdGljL3RyaW1tb21hdGljX3Bsb3QucG5nKXt3aWR0aD01NTBweH0KCmBgYHtyIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGZvcm1hdHRhYmxlKQpkZl9zdGF0cyA8LSByZWFkX3RzdigidHJpbW1vbWF0aWMvdHJpbW1vbWF0aWNfcGxvdC50c3YiLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQppcy5udW0gPC0gc2FwcGx5KGRmX3N0YXRzLCBpcy5udW1lcmljKQpkZl9zdGF0c1tpcy5udW1dIDwtIGxhcHBseShkZl9zdGF0c1tpcy5udW1dLCByb3VuZCwgMSkKZm9ybWF0dGFibGUoZGZfc3RhdHMsIGxpc3QoCiAgICAnVG90YWxSZWFkcycgPSBjb2xvcl9iYXIoIiNCREI3NkIiKSwKICAgICdTdXJ2aXZpbmdSZWFkcycgPSBjb2xvcl9iYXIoIiM5MEVFOTAiKSwKICAgICdQZXJjZW50U3Vydml2aW5nJyA9IGNvbG9yX2JhcigiIzMyQ0QzMiIpLAogICAgJ0Ryb3BwZWRSZWFkcycgPSBjb2xvcl9iYXIoIiNGMDgwODAiKSwKICAgICdQZXJjZW50RHJvcHBlZCcgPSBjb2xvcl9iYXIoIiNDRDVDNUMiKSksCiAgICB0YWJsZS5hdHRyID0gImNsYXNzPVwndGFibGUgdGFibGUtY29uZGVuc2VkXCcsIHN0eWxlPVwnd2lkdGg6MTAwJTsgZm9udC1zaXplOjkwJTtcJyIKKQpgYGAKCQkJCQoKIyMgUUMgZm9yIHRyaW1tZWQgcmVhZHMKClF1YWxpdHkgQ29udHJvbCAoUUMpIGlzIGRvbmUgZm9yIHRoZSB0cmltbWVkIHJlYWRzIHdpdGggZmFzdFFDLiAKV2UgYWN0aXZhdGUgdGhlIGNvbmRhIGVudmlyb25tZW50IGBjb25kYWZhc3RxY2AgZm9yIHRoaXMgcHJvY2Vzcy4KCmBgYAppZiAoIXJlcXVpcmUoImZhc3RxY3IiKSkgewogICAgICAgIGluc3RhbGwucGFja2FnZXMoImZhc3RxY3IiLCByZXBvcz0iaHR0cDovL2NyYW4udXMuci1wcm9qZWN0Lm9yZyIpCiAgICAgICAgbGlicmFyeShmYXN0cWNyKQp9IGVsc2Uge2xpYnJhcnkoZmFzdHFjcil9CmZhc3RxYyhmcS5kaXI9Ii9wYXRoL3RvL2RpcmVjdG9yeS90cmltbWVkX2Zhc3RxX2ZpbGVzIiwKICAgICAgcWMuZGlyPSIvcGF0aC90by9kaXJlY3RvcnkvZmFzdHFjL3RyaW1fZmFzdHFjIiwKICAgICAgdGhyZWFkcz0yMCkKYGBgCgpSdW5uaW5nIHRoZSBzY3JpcHQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CmBgYApSc2NyaXB0IGZhc3RxY3IuUgpgYGAKCiMjIyBGYXN0UUMgT3V0cHV0CgpQbG90cyBmb3IgZWFjaCBGQVNUUUMgbWV0cmljIGFmdGVyIHRyaW1taW5nIGlzIHNob3duIGJlbG93LiAKQWxsIHRoZSBhZGFwdGVycyB3ZXJlIHJlbW92ZWQgYW5kIG92ZXJhbGwgcXVhbGl0eSBsb29rcyBiZXR0ZXIuCgoqKkdlbmVyYWwgU3RhdGlzdGljcyBmcm9tIG11bHRpcWMqKgpgYGB7ciBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJywgd2FybmluZz1GQUxTRX0KbGlicmFyeShyZWFkcikKbGlicmFyeShmb3JtYXR0YWJsZSkKZGZfc3RhdHMgPC0gcmVhZF90c3YoIm11bHRpcWNfdHJpbV9mYXN0cS9nZW5lcmFsX3N0YXRzX3RhYmxlLnRzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCmlzLm51bSA8LSBzYXBwbHkoZGZfc3RhdHMsIGlzLm51bWVyaWMpCmRmX3N0YXRzW2lzLm51bV0gPC0gbGFwcGx5KGRmX3N0YXRzW2lzLm51bV0sIHJvdW5kLCAxKQpmb3JtYXR0YWJsZShkZl9zdGF0cywgbGlzdCgKICAgICdQZXJjZW50RHVwcycgPSBjb2xvcl9iYXIoIiNFOTk2N0EiKSwKICAgICdQZXJjZW50R0MnID0gY29sb3JfYmFyKCIjREFBNTIwIiksCiAgICAnQlBNZWRpYW5SZWFkTGVuZ3RoJyA9IGNvbG9yX2JhcigiIzY2Q0RBQSIpLAogICAgJ01pbGxpb25zU2VxcycgPSBjb2xvcl9iYXIoIiNEQTcwRDYiKSksCiAgICB0YWJsZS5hdHRyID0gImNsYXNzPVwndGFibGUgdGFibGUtY29uZGVuc2VkXCcsIHN0eWxlPVwnd2lkdGg6ODAlOyBmb250LXNpemU6OTAlO1wnIgopCmBgYAoqKlNlcXVlbmNlIENvdW50cyBmb3IgZWFjaCBzYW1wbGUqKgoKIVtTZXF1ZW5jZSBDb3VudHNdKG11bHRpcWNfdHJpbV9mYXN0cS9tdWx0aXFjX3Bsb3RzL2Zhc3RxY19zZXF1ZW5jZV9jb3VudHNfcGxvdC5wbmcpe3dpZHRoPTU1MHB4fQoKKipUaGUgbWVhbiBxdWFsaXR5IHNjb3JlcyBwZXIgYmFzZSBpbiB0aGUgcmVhZCoqCgohW1BlciBCYXNlIFF1YWxpdHldKG11bHRpcWNfdHJpbV9mYXN0cS9tdWx0aXFjX3Bsb3RzL2Zhc3RxY19wZXJfYmFzZV9zZXF1ZW5jZV9xdWFsaXR5X3Bsb3QucG5nKXt3aWR0aD01NTBweH0KCioqVGhlIGF2ZXJhZ2UgcXVhbGl0eSBzY29yZXMgcGVyIHNlcXVlbmNlKioKCiFbUGVyIFNlcXVlbmNlIFF1YWxpdHldKG11bHRpcWNfdHJpbV9mYXN0cS9tdWx0aXFjX3Bsb3RzL2Zhc3RxY19wZXJfc2VxdWVuY2VfcXVhbGl0eV9zY29yZXNfcGxvdC5wbmcpe3dpZHRoPTU1MHB4fQoKKipUaGUgR0MgY29udGVudCBwZXIgc2VxdWVuY2UqKgoKIVtHQyBjb25ldGVudF0obXVsdGlxY190cmltX2Zhc3RxL211bHRpcWNfcGxvdHMvZmFzdHFjX3Blcl9zZXF1ZW5jZV9nY19jb250ZW50X3Bsb3QucG5nKXt3aWR0aD01NTBweH0KCgoqKlNlcXVlbmNlIER1cGxpY2F0aW9uKioKCiFbRHVwbGljYXRpb24gaW4gZWFjaCBzZXF1ZW5jZV0obXVsdGlxY190cmltX2Zhc3RxL211bHRpcWNfcGxvdHMvZmFzdHFjX3NlcXVlbmNlX2R1cGxpY2F0aW9uX2xldmVsc19wbG90LnBuZyl7d2lkdGg9NTUwcHh9CgoqKk92ZXJyZXByZXNlbnRlZCBzZXF1ZW5jZXMqKgoKIVtUb3RhbCBvdmVycmVwcmVzZW50ZWQgc2VxdWVuY2VzIGZvdW5kIGluIGVhY2ggc2FtcGxlXShtdWx0aXFjX3RyaW1fZmFzdHEvbXVsdGlxY19wbG90cy9mYXN0cWNfb3ZlcnJlcHJlc2VudGVkX3NlcXVlbmNlc19wbG90LnBuZyl7d2lkdGg9NTUwcHh9CgoqKk92ZXJhbGwgUGFzcy9GYWlsKioKCiFbQ2hlY2tpbmcgaWYgZWFjaCBzYW1wbGUgcGFzc2VzIG9yIGZhaWxzIGluIHZhcmlvdXMgbWV0ZXJpc10obXVsdGlxY190cmltX2Zhc3RxL211bHRpcWNfcGxvdHMvZmFzdHFjLXN0YXR1cy1jaGVjay1oZWF0bWFwLnBuZyl7d2lkdGg9NTUwcHh9CgoqKlNlcXVlbmNlIGxlbmd0aCBkaXN0cmlidXRpb24qKgoKIVtsZW5ndGggZGlzdHJpYnV0aW9uIG9mIHNlcXVlbmNlc10obXVsdGlxY190cmltX2Zhc3RxL211bHRpcWNfcGxvdHMvZmFzdHFjX3NlcXVlbmNlX2xlbmd0aF9kaXN0cmlidXRpb25fcGxvdC5wbmcpe3dpZHRoPTU1MHB4fQoKIyMgQWxpZ25tZW50CgpUaGUgdHJpbW1lZCByZWFkcyBhcmUgYWxpZ25lZCB0byB0aGUgcmVmZXJlbmNlIGdlbm9tZSB1c2luZyBib3d0aWUuClRvIGFuYWx5emUgcmVhZHMgbWFwcGluZyB3aXRoIG1pdG9jaG9uZHJpYWwgZ2Vub21lLCB3ZSBwZXJmb3JtIHRoZSBhbGlnbm1lbnQgaW4gdHdvIHN0ZXBzLgoKMS4gQ29tcGxldGUgR2Vub21lICh3aXRoIG1pdG9jaG9uZHJpYWwgZ2Vub21lKS0gd2l0aCBhbGdlbm9tZS5mYQoyLiBPbmx5IHRoZSBNaXRvY2hvbmRyaWFsIGdlbm9tZSB3aGljaCBpcyBleHRyYWN0ZWQgZnJvbSBnZW5vbWUuZmEtIGFsbWl0b2dlbm9tZS5mYQoKVG8gYmVnaW4gYWxpZ25tZW50LCB3ZSBtYWtlIGJvd3RpZSBpbmRleGVzLCB0aGlzIGlzIGRvbmUgaW4gdHdvIHNldHMuCgpgYGAKYm93dGllLWluZGV4IGFsZ2Vub21lLmZhCmJvd3RpZS1pbmRleCBhbG1pdG9nZW5vbWUuZmEKYGBgCgojIyMgQWxpZ25tZW50IHdpdGggZ2Vub21lCgpUaGUgYWxpZ25tZW50IHdhcyBkb25lIG9uIHRoZSB0cmltbWVkIHJlYWRzIGZyb20gcHJldmlvdXMgc2VjdGlvbi4KCmBgYAojIS9iaW4vYmFzaApGSUxFUz0iL2Rpc2svYmlvc2NyYXRjaC9Qb2RyYWJfbGFiL2dhemFsL3NSTkFfZ2F6YWwvdHJpbS8qLmZhc3RxIgpmb3IgZiBpbiAkRklMRVMKICAgIGRvCiAgICAgICAgYj1gYmFzZW5hbWUgJGZgCiAgICAgICAgZWNobyBSdW5uaW5nIHRyaW1taW5nIGZvciB0aGUgZmlsZSAkYgogICAgICAgIHQ9JHtiOjotNn0KICAgICAgICBvPSIkdC5zYW0iCiAgICAgICAgdW89IiR0Lm1hcHBlZC5mcSIKICAgICAgICBlY2hvIE91dHB1dCBmaWxlIGlzICRvCiAgICAgICAgYm93dGllIFwKCSAtcCAyMCBcCiAgICAgCSAtdCBcCgkgLWsgNSBcCgkgLS1iZXN0IFwKCSAtLXN0cmF0YSBcCgkgLWUgOTk5OTkgXAoJIC12IDAgXAogICAJIC1sIDE1IFwKICAJIC0tY2h1bmttYnMgMjA0OCBcCgkgLXggL2Rpc2svYmlvc2NyYXRjaC9Qb2RyYWJfbGFiL2dhemFsL3NSTkFfZ2F6YWwvYm93dGllX2luZGV4X2FsaW0vYWxnZW5vbWUgXAoJIC1xICRmIFwKCSAtLWFsICR1byBcCgkgLS1zYW0gLS1uby11bmFsID4gJG8gMj4gJHQuYm93dGllLmxvZwogICAgZG9uZQojZG9uZQpgYGAKClRoZSBmb2xsb3dpbmcgc3RhdHMgc2hvdyBhbGlnbm1lbnQgUUMuIAoKIVtCb3d0aWUgQWxpZ25tZW50IFN0YXRzIHdpdGggR2Vub21lXShhbGlnbm1lbnQvZ2Vub21lL2Jvd3RpZTFfYWxpZ25tZW50LnBuZyl7d2lkdGg9NTUwcHh9CgpUaGlzIHRhYmxlIHNob3dzIHRoZSBudW1iZXIgb2YgcmVhZHMgYWxpZ25lZCBpbiBlYWNoIHNhbXBsZSAoTWlsbGlvbkFsaWduZWRSZWFkcykuIApJdCBhbHNvIHNob3dzIHRoZSBudW1iZXIgb2YgYWxpZ21lbnRzIG9mIHZhcmlvdXMgcmVhZHMgdGhhdCBpbmNsdWRlcyBtdWx0aW1hcHBlZCByZWFkcyAoTWlsbGlvbk1hcHBlZFJlYWRzKS4KCmBgYHtyIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGZvcm1hdHRhYmxlKQpkZl9zdGF0cyA8LSByZWFkX3RzdigiYWxpZ25tZW50L2dlbm9tZS9nZW5lcmFsX3N0YXRzX3RhYmxlLnRzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCmlzLm51bSA8LSBzYXBwbHkoZGZfc3RhdHMsIGlzLm51bWVyaWMpCmRmX3N0YXRzW2lzLm51bV0gPC0gbGFwcGx5KGRmX3N0YXRzW2lzLm51bV0sIHJvdW5kLCAxKQpmb3JtYXR0YWJsZShkZl9zdGF0cywgbGlzdCgJCiAgICAnUGVyY2VudEFsaWduZWQnID0gY29sb3JfYmFyKCIjQjBDNERFIiksCiAgICAnTWlsbGlvbkFsaWduZWRSZWFkcycgPSBjb2xvcl9iYXIoIiNFNkU2RkEiKSwKICAgICdNaWxsaW9uTWFwcGVkUmVhZHMnID0gY29sb3JfYmFyKCIjNzc4ODk5IiksCiAgICB0YWJsZS5hdHRyID0gImNsYXNzPVwndGFibGUgdGFibGUtY29uZGVuc2VkXCcsIHN0eWxlPVwnd2lkdGg6ODAlOyBmb250LXNpemU6OTAlO1wnIikKKQpgYGAKIyMjIEFsaWdubWVudCB3aXRoIG1pdG9jaG9uZHJpYQoKVGhlIGFsaWdubWVudCB3YXMgZG9uZSBvbiB0aGUgdHJpbW1lZCByZWFkcyBmcm9tIHByZXZpb3VzIHNlY3Rpb24uCgpUaGUgZm9sbG93aW5nIHN0YXRzIHNob3cgYWxpZ25tZW50IFFDLiAKCmBgYAojIS9iaW4vYmFzaApGSUxFUz0iL2Rpc2svYmlvc2NyYXRjaC9Qb2RyYWJfbGFiL2dhemFsL3NSTkFfZ2F6YWwvdHJpbS8qLmZhc3RxIgkKZm9yIGYgaW4gJEZJTEVTCiAgICBkbwogICAgICAgIGI9YGJhc2VuYW1lICRmYAogICAgICAgIGVjaG8gUnVubmluZyBhbGlnbm1lbnQgZm9yIHRoZSBmaWxlICRiCiAgICAgICAgdD0ke2I6Oi02fQogICAgICAgIG89IiR0LnNhbSIKCXVvPSIkdC5tYXBwZWQuZnEiCiAgICAgICAgZWNobyBPdXRwdXQgZmlsZSBpcyAkbwogICAgICAgIGJvd3RpZSBcCgkgLXAgMjAgXAogICAgIAkgLXQgXAoJIC1rIDEwIFwKCSAtLWJlc3QgXAoJIC0tc3RyYXRhIFwKCSAtZSA5OTk5OSBcCgkgLXYgMCBcCiAgIAkgLWwgMTUgXAogIAkgLS1jaHVua21icyAyMDQ4IFwKCSAteCAvZGlzay9iaW9zY3JhdGNoL1BvZHJhYl9sYWIvZ2F6YWwvc1JOQV9nYXphbC9ib3d0aWVfbWl0b19pbmRleC9hbG1pdG9nZW5vbWUgXAoJIC1xICRmIFwKCSAtLWFsICR1byBcCgkgLS1zYW0gLS1uby11bmFsID4gJG8gMj4gJHQuYm93dGllLmxvZwogICAgZG9uZQojZG9uZQpgYGAKCiFbQm93dGllIEFsaWdubWVudCBTdGF0cyB3aXRoIE1pdG9jaG9uZHJpYWwgR2Vub21lXShhbGlnbm1lbnQvbWl0b2Nob25kcmlhL2Jvd3RpZTFfYWxpZ25tZW50LnBuZyl7d2lkdGg9NTUwcHh9CgpUaGlzIHRhYmxlIHNob3dzIHRoZSBudW1iZXIgb2YgcmVhZHMgYWxpZ25lZCBpbiBlYWNoIHNhbXBsZSAoTWlsbGlvbkFsaWduZWRSZWFkcykuIApJdCBhbHNvIHNob3dzIHRoZSBudW1iZXIgb2YgYWxpZ21lbnRzIG9mIHZhcmlvdXMgcmVhZHMgdGhhdCBpbmNsdWRlcyBtdWx0aW1hcHBlZCByZWFkcyAoTWlsbGlvbk1hcHBlZFJlYWRzKS4KCmBgYHtyIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGZvcm1hdHRhYmxlKQpkZl9zdGF0cyA8LSByZWFkX3RzdigiYWxpZ25tZW50L21pdG9jaG9uZHJpYS9nZW5lcmFsX3N0YXRzX3RhYmxlLnRzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCmlzLm51bSA8LSBzYXBwbHkoZGZfc3RhdHMsIGlzLm51bWVyaWMpCmRmX3N0YXRzW2lzLm51bV0gPC0gbGFwcGx5KGRmX3N0YXRzW2lzLm51bV0sIHJvdW5kLCAyKQpmb3JtYXR0YWJsZShkZl9zdGF0cywgbGlzdCgJCiAgICAnUGVyY2VudEFsaWduZWQnID0gY29sb3JfYmFyKCIjQjBDNERFIiksCiAgICAnTWlsbGlvbkFsaWduZWRSZWFkcycgPSBjb2xvcl9iYXIoIiNFNkU2RkEiKSwKICAgICdNaWxsaW9uTWFwcGVkUmVhZHMnID0gY29sb3JfYmFyKCIjNzc4ODk5IiksCiAgICB0YWJsZS5hdHRyID0gImNsYXNzPVwndGFibGUgdGFibGUtY29uZGVuc2VkXCcsIHN0eWxlPVwnd2lkdGg6ODAlOyBmb250LXNpemU6OTAlO1wnIikKKQpgYGAKCiMjIFVzaW5nIGFsaWduZWQgcmVhZHMKKipDb21pbmcgU29vbioqCgojIyMgbWlSVHJhY2UKIFJ1bm5pbmcgbWlydHJhY2Ugd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQuCmBgYAojIS9iaW4vYmFzaAptaXJ0cmFjZSBxYyAtLXNwZWNpZXMgZHJlIC0tY29uZmlnIHNlcV9hZGRyZXNzLnR4dApgYGAKCkxvb2tpbmcgYXQgdGhlIHJlc3VsdHM6CgohW10obWlydHJhY2UvbWlydHJhY2UtbGVuZ3RoLXBsb3QucG5nKXt3aWR0aD0xMDAlfQohW10obWlydHJhY2UvbWlydHJhY2Utcm5hdHlwZS1wbG90LnBuZyl7d2lkdGg9MTAwJX0KCiMjIyBzcG9ydHMKCkV4ZWN1dGluZyBzcG9ydHMgdG9vbCBvbiBtYXBwZWQgcmVhZHMgb25seS4gV2UgdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCB0byBydW46CgpgYGAKIyEvYmluL2Jhc2gKc3BvcnRzLnBsIC1pIHNlcXNfYWxpbV9taXRvLnR4dCBcCi1vIC9kaXNrL2Jpb3NjcmF0Y2gvUG9kcmFiX2xhYi9nYXphbC9zUk5BX2dhemFsL2FsaWduX3dpdGhfYWxpbW5hZXVzL2dlbl9pbnB1dF9mYXN0cS9TUE9SVFMvb3V0X3Nwb3J0cy9SRURPL21pdG9fbWFwcGVkX3JlYWRzIFwKLWsgXAotTSAyIFwKLXAgMjAgXAotZyAvZGlzay9iaW9zY3JhdGNoL1BvZHJhYl9sYWIvZ2F6YWwvc1JOQV9nYXphbC9ib3d0aWVfbWl0b19pbmRleC9hbG1pdG9nZW5vbWUgXAotbSAvZGlzay9iaW9zY3JhdGNoL1BvZHJhYl9sYWIvZ2F6YWwvc1JOQV9nYXphbC9hbGlnbl93aXRoX2FsaW1uYWV1cy9nZW5faW5wdXRfZmFzdHEvU1BPUlRTL3Nwb3J0czEuMS9kYi9EYW5pb19yZXJpby9taVJCYXNlXzIxL21pUkJhc2VfMjEtZHJlIFwKLXIgL2Rpc2svYmlvc2NyYXRjaC9Qb2RyYWJfbGFiL2dhemFsL3NSTkFfZ2F6YWwvYWxpZ25fd2l0aF9hbGltbmFldXMvZ2VuX2lucHV0X2Zhc3RxL1NQT1JUUy9zcG9ydHMxLjEvZGIvRGFuaW9fcmVyaW8vclJOQV9kYi96ZWJyYWZpc2hfclJOQSBcCi10IC9kaXNrL2Jpb3NjcmF0Y2gvUG9kcmFiX2xhYi9nYXphbC9zUk5BX2dhemFsL2FsaWduX3dpdGhfYWxpbW5hZXVzL2dlbl9pbnB1dF9mYXN0cS9TUE9SVFMvc3BvcnRzMS4xL2RiL0RhbmlvX3JlcmlvL0d0Uk5BZGIvZGFuUmVyNi10Uk5BcyBcCi13IC9kaXNrL2Jpb3NjcmF0Y2gvUG9kcmFiX2xhYi9nYXphbC9zUk5BX2dhemFsL2FsaWduX3dpdGhfYWxpbW5hZXVzL2dlbl9pbnB1dF9mYXN0cS9TUE9SVFMvc3BvcnRzMS4xL2RiL0RhbmlvX3JlcmlvL3BpUkJhc2UvcGlSX2RyZV92MS4wIFwKLWUgL2Rpc2svYmlvc2NyYXRjaC9Qb2RyYWJfbGFiL2dhemFsL3NSTkFfZ2F6YWwvYWxpZ25fd2l0aF9hbGltbmFldXMvZ2VuX2lucHV0X2Zhc3RxL1NQT1JUUy9zcG9ydHMxLjEvZGIvRGFuaW9fcmVyaW8vRW5zZW1ibC9EYW5pb19yZXJpby5HUkN6MTAubmNybmEgXAotZiAvZGlzay9iaW9zY3JhdGNoL1BvZHJhYl9sYWIvZ2F6YWwvc1JOQV9nYXphbC9hbGlnbl93aXRoX2FsaW1uYWV1cy9nZW5faW5wdXRfZmFzdHEvU1BPUlRTL3Nwb3J0czEuMS9kYi9EYW5pb19yZXJpby9SZmFtXzEyLjMvUmZhbS0xMi4zLXplYnJhZmlzaApgYGAKClRoaXMgd2lsbCBnZW5lcmF0ZSBhIG51bWJlciBvZiBvdXRwdXQgZmlsZXMsIGZyb20gd2hpY2ggdGhlIHRhYmxlcwpnZW5lcmF0ZWQgYXMgYSByZXN1bHQgZmlsZSAqX291dHB1dC50eHQgZm9yIGVhY2ggc2FtcGxlIGFyZSB0YWtlbiBhbmQgCmFyZSB1c2VkIHRvIGV4dHJhY3QgYW5ub3RhdGlvbiBvZiBtYXBwZWQgcmVhZHMuClRvcCA1MCByb3dzIG9mIHRoaXMgdGFibGUgYXJlIHNob3duIGZvciB0aGUgc2FtcGxlIDEwXzEyZF80aHJBIGJlbG93LiAKCgohW10oc3BvcnRzL1NjcmVlbnNob3Rmcm9tMTBfMTJkXzRockEucG5nKXt3aWR0aD01NTBweH0KCkl0IGFsc28gZ2VuZXJhdGVzIGEgbnVtYmVyIG9mIHBsb3RzIHRvIGNhdGVnb3JpemUgdGhlIGFubm90YXRpb25zIAphbmQgdGhlaXIgbGVuZ3RoIGRpc3RyaWJ1dGlvbnMgZm9yIGVhY2ggc2FtcGxlLgoKIVtdKHNwb3J0cy9TY3JlZW5zaG90MTBfMTJkXzRockEucG5nKXt3aWR0aD01NTBweH0KIVtdKHNwb3J0cy9TY3JlZW5zaG90MTBfMTJkXzRockFfZ3JhcGgucG5nKXt3aWR0aD01NTBweH0KCiMjIENvbXBpbGluZyBvdXRwdXQgZmlsZXMKKipDb21pbmcgU29vbioqCgojIyBWaXN1YWxpemluZwpXZSB1c2UgdGhlIGFsaWdubWVudHMgd2l0aCBtaXRvY2hvbmRyaWFsIGdlbm9tZSB0byB2aWV3IHRoZSBhbGlnbmVkIHJlYWRzLgoKSmJyb3dzZSBpcyB1c2VkIHRvIGV4cGxvcmUgYWxpZ25tZW50cy4KCkZpbGVzIHVzZWQ6CgoxLiBBbGlnbmVkIGJhbSBmaWxlcyBmb3IgZWFjaCBzYW1wbGUgYW5kIGl0cyBjb3JyZXNwb25kaW5nIGluZGV4IGZpbGUgKGJhbSwgYmFpKQozLiBSZWZlcmVuY2UgZ2Vub21lIGZvciBtaXRvY2hvbmRyaWEgKC5mYXN0YSkgYW5kIGl0cyBpbmRleCBmaWxlICguZmFpKQo0LiBHZW5vbWUgZmVhdHVyZSBmaWxlICguZ2ZmKSBmb3IgbWl0b2Nob25kcmlhbCBnZW5vbWUKCiFbXShqYnJvd3NlL2picm93c2VfNGRfdDAuc3ZnKXt3aWR0aD0xMDAlfQoKVGhpcyBmaWd1cmUgc2hvd3MgbWl0b2Nob25kaXJhbCBnZW5vbWUgb2YgMTAwYnAgbGVuZ3RoIGZyb20gMTcxMDAgdG8gMTcxOTkuIE9uIHRoaXMgZ2Vub21lLCB3ZSBzZWUgCjEpIHRoZSBjb2xvcmVkIGJhc2VwYWlycywgMikgR2Vub21pYyBmZWF0dXJlcyBvZiB0aGUgbWVudGlvbmVkIGxlbmd0aCwgMykgQWxpZ25tZW50cyBmcm9tIDQgc2FtcGxlcyAoNGQgdDAgcmVwbGljYXRlcykKdGhhdCBzaG93IHJlYWRzIGFsaWduZWQgdG8gdGhlIGdlbm9tZSBjb2xvcmVkIGJ5IHN0cmFuZCB3aGlsZSBhbHNvIHNob3dpbmcgdGhlIGNvdmVyYWdlIGhpc3RvZ3JhbSBpbiBncmV5LiA=